#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Student {
    int id;
    char name[32];
    float score;
};

struct Node {
    struct Student data;
    struct Node* next;

};

typedef struct Node* LinkList;
struct Node *HeaderList = NULL;

//初始化链表
LinkList initList() {
    struct Node* L = (struct Node*)malloc(sizeof(struct Node));
    if (L == NULL) {
        printf("wrong");
        //weik
        return NULL;
    }
    L->next = NULL;
    return L;
}

//实现添加功能
void add(int n, struct Student* sts) {
    //需要插入的节点
    struct Node* temp1 = (struct Node *)malloc(sizeof(struct Node));
    temp1->next = 0;
    temp1->data = *sts;
    //复制头结点
    struct Node* temp = HeaderList;
    for (int i = 0; i < n - 1; i++) {
        //移动到第n-1个节点处
        temp = temp->next;
    }
//    进行插入操作
    temp1->next = temp->next;
    temp->next = temp1;

}

//实现遍历功能
void traverse() {
    struct Node *temp = HeaderList;
    int i = 0;
    while (temp) {
        printf("%d %d %s %.2f %p\n", i, temp->data.id, temp->data.name, temp->data.score, temp);
        temp = temp->next;
        i++;
    }

}

//实现访问功能，按结点位置返回学生信息；
void visitList(int n) {
    struct Node *temp = HeaderList;
    int i = 0;
    while (temp) {
        if (i == n) {
            printf("访问到第%d个节点的数据为： %d %s %.2f %p\n", i, temp->data.id, temp->data.name, temp->data.score, temp);
            return;
        }
        i++;
        temp = temp->next;

    }
}

//实现查找功能，按姓名进行查找，返回该学生的三项信息；
void findList(char name[]) {
    struct Node *temp = HeaderList;
    int i = 0;
    while (temp) {
        if (strcmp(temp->data.name, name) == 0) {
            printf("搜索到第%d个学生的信息为%d %s %.2f\n", i, temp->data.id, temp->data.name, temp->data.score);
            return;
        }
        i++;
        temp = temp->next;
    }
    printf("没有找到该学生\n");
}

//实现删除功能
void deleteList(int id) {
    struct Node *temp = HeaderList;
    int i = 1;
    while (temp) {
        if (temp->next->data.id == id) {
            struct Node* p = temp->next;
            temp->next = temp->next->next;
            printf("第%d号节点删除成功\n", i);
            free(p);
            return;
        }
        i++;
        temp = temp->next;

    }
    printf("没找到该数据");
}

//实现统计功能，统计链表中的数据项数量，即学生总数。
void countlist() {
    struct Node *temp = HeaderList;
    int i = 0;
    while (temp->next) {
        temp = temp->next;
        i++;
    }
    printf("一共有%d个学生", i);
}

//释放内存
void freeList(){
    struct Node* p = HeaderList;
    while (p!= NULL) {
        struct Node* temp2=p->next;
        printf("freeing %p \n", p);
        free(p);
        p=temp2;
    }
}

int main() {
    struct Student sts[] = {
        {
            2022001, "赵萌", 83
        },
        {
            2022002, "钱强", 71

        },
        {
            2022003, "孙越", 92

        },
        {
            2022004, "李峰", 68
        }

    };
//    返回链表
    struct Node* L = initList();
//    头指针指向链表
    HeaderList = L;
    add(1, &sts[0]);
    add(2, &sts[1]);
    add(3, &sts[2]);
    add(4, &sts[3]);
//    deleteList(2022002);
//    visitList(3);
//    char name[]="钱强";
//    findList(name);
    freeList();
    printf("\nafter free ...\n");
    traverse();
//    countlist();

}
